package edu.upc.e402grupo02.e402grupo02.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import edu.upc.e402grupo02.e402grupo02.dao.ServicioDAO;
import edu.upc.e402grupo02.e402grupo02.modelo.Comentario;
import edu.upc.e402grupo02.e402grupo02.modelo.Servicio;
import edu.upc.e402grupo02.e402grupo02.modelo.UsuarioWeb;
import edu.upc.e402grupo02.e402grupo02.util.Constantes;

public class ServicioDAOImpl implements ServicioDAO{

	protected JdbcTemplate jdbcTemplate;

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	
	public Servicio findById(String id) {
		String sql = "select id, descripcion from T_SERVICIO where id=?";
		Object[] params = new Object[]{ id };
		
		try{
			return jdbcTemplate.queryForObject(sql, params, new RowMapper<Servicio>(){

				public Servicio mapRow(ResultSet rs, int arg1) throws SQLException {
					Servicio servicio = new Servicio();
					servicio.setId(rs.getInt(1));
					servicio.setDescripcion(rs.getString(2));
					return servicio;
				}
				
			});
		}catch(EmptyResultDataAccessException e){
			return null;
		}
	}

	
	public void mostrarComentarios(Servicio s) {
		StringBuffer sql =  new StringBuffer();
		sql.append("select id, u.login, u.nombre, u.correo, descripcion, c.estado, fecha, voto_pos, voto_neg ");
		sql.append("from T_COMENTARIO_SERVICIO c ");
		sql.append(" inner join T_USUARIO_WEB u on u.login = usuario_web ");
		sql.append(" where id_servicio = ?");
		
		Object[] params = new Object[]{ s.getId() };
		
		List<Comentario> list = jdbcTemplate.query(sql.toString(), params, new RowMapper<Comentario>(){

			public Comentario mapRow(ResultSet rs, int arg1) throws SQLException {
				
				UsuarioWeb usuarioWeb = new UsuarioWeb(rs.getString(2), rs.getString(3), rs.getString(4));
				Comentario c = new Comentario(rs.getInt(1), usuarioWeb, rs.getString(5));
				c.setEstado(rs.getString(6));
				c.setFecha(rs.getDate(7));
				c.setVoto_pos(rs.getInt(8));
				c.setVoto_neg(rs.getInt(9));
				return c;
			}
			
		});
		
		s.setComentarios(list);
		
		System.out.println();
		System.out.println("Comentarios");
		System.out.println("------------------------------------------------------------------");
		for(Comentario comentario : s.getComentarios()){
			if(Constantes.ESTADO_COMENTARIO_ACTIVO.equals(comentario.getEstado())){
				System.out.println(comentario.toString());
			}
		}
		System.out.println();
	}

	public boolean registrarComentario(Servicio p, UsuarioWeb usuarioWeb,
			String desc) {
		System.out.println("\tRegistrar un comentario");
		System.out.println("\t------------------------------------");
		System.out.println("\t Servicio: " + p.getDescripcion());
		
		StringBuffer sql =  new StringBuffer();
		sql.append("insert into t_comentario_servicio ");
		sql.append("(id_servicio, usuario_web, descripcion, estado, fecha, voto_pos, voto_neg) ");
		sql.append("values (?, ?, ?, ?, sysdate(),0,0)");
		
		Object[] params = new Object[]{ p.getId(), usuarioWeb.getLogin(), desc, Constantes.ESTADO_COMENTARIO_ACTIVO };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		System.out.println((result>0)?"\tSe registro el comentario!!":"\tNo se registro!!");
		
		return result>0;
	}

	public boolean eliminarComentario(Servicio p, int idComentario) {
		System.out.println("\tEliminar un comentario");
		System.out.println("\t------------------------------------");
		System.out.println("\t Servicio: " + p.getDescripcion());
		System.out.println("\t Comentario: " + idComentario);
		
		StringBuffer sql =  new StringBuffer();
		sql.append("delete from t_comentario_servicio ");
		sql.append(" where id_servicio=? and id=? ");
		
		Object[] params = new Object[]{ p.getId(), idComentario };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		System.out.println((result>0)?"\tSe elimino el comentario!!":"\tNo se elimino!!");
		return result>0;
	}


	public boolean ocultarComentario(int idComentario) {
		System.out.println("\tOcultar un comentario");
		System.out.println("\t------------------------------------");
		System.out.println("\t comentario: " + idComentario);
		
		StringBuffer sql =  new StringBuffer();
		sql.append("update t_comentario_servicio ");
		sql.append("set estado = ? ");
		sql.append("where id = ? ");
		
		Object[] params = new Object[]{ Constantes.ESTADO_COMENTARIO_INACTIVO, idComentario };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		System.out.println((result>0)?"\tSe oculto el comentario!!":"\tNo se oculto!!");
		
		return result>0;
	}


	public boolean valorizar(int idComentario, boolean positivo) {
		System.out.println("\tOcultar un comentario");
		System.out.println("\t------------------------------------");
		System.out.println("\t comentario: " + idComentario);
		
		Comentario comentario = findComentarioById(idComentario);
		
		StringBuffer sql =  new StringBuffer();
		sql.append("update t_comentario_servicio ");
		if(positivo)
			sql.append("set voto_pos = ? ");
		else
			sql.append("set voto_neg = ? ");
		
		sql.append("where id = ? ");
		
		Object[] params = new Object[]{ (positivo)?(comentario.getVoto_pos()+1):(comentario.getVoto_neg()+1), idComentario };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		System.out.println((result>0)?"\tSe valorizo el comentario!!":"\tNo se valorizo!!");
		
		return result>0;
	}


	public Comentario findComentarioById(int id) {
		StringBuffer sql =  new StringBuffer();
		sql.append("select id, u.login, u.nombre, u.correo, descripcion, c.estado, fecha, voto_pos, voto_neg ");
		sql.append("from T_COMENTARIO_SERVICIO c ");
		sql.append(" inner join T_USUARIO_WEB u on u.login = usuario_web ");
		sql.append(" where id = ?");
		
		Object[] params = new Object[]{ id };
		
		Comentario comentario = jdbcTemplate.queryForObject(sql.toString(), params, new RowMapper<Comentario>(){

			public Comentario mapRow(ResultSet rs, int arg1) throws SQLException {
				
				UsuarioWeb usuarioWeb = new UsuarioWeb(rs.getString(2), rs.getString(3), rs.getString(4));
				Comentario c = new Comentario(rs.getInt(1), usuarioWeb, rs.getString(5));
				c.setEstado(rs.getString(6));
				c.setFecha(rs.getDate(7));
				c.setVoto_pos(rs.getInt(8));
				c.setVoto_neg(rs.getInt(9));
				return c;
			}
			
		});
		
		return comentario;
	}

}
